/// File:   scanmatrix.h
/// Author: greg.sandstrom@gmail.com
/// 
/// The following matrix sets the scancodes (as integers) for an Apple keyboard of unknow vintage.
/// All keys are set to their acutal scancode (as best I could manage) except the HELP and EJECT keys, which are mapped to their own macros.
/// Also included is a re-mapping for the Dvorak layout.

#ifndef __scanmatrix_h__
#define __scanmatrix_h__

#define ____ 0x00

#define MCRO 0xFFFF0000
#define IS_MACRO(c) ((c&MCRO)==MCRO)

#define HELP (MCRO+1)
#define EJCT (MCRO+2)

#define __a_ 0x1C
#define __b_ 0x32
#define __c_ 0x21
#define __d_ 0x23
#define __e_ 0x24
#define __f_ 0x2B
#define __g_ 0x34
#define __h_ 0x33
#define __i_ 0x43
#define __j_ 0x3B
#define __k_ 0x42
#define __l_ 0x4B
#define __m_ 0x3A
#define __n_ 0x31
#define __o_ 0x44
#define __p_ 0x4D
#define __q_ 0x15
#define __r_ 0x2D
#define __s_ 0x1B
#define __t_ 0x2C
#define __u_ 0x3C
#define __v_ 0x2A
#define __w_ 0x1D
#define __x_ 0x22
#define __y_ 0x35
#define __z_ 0x1A

// KeyPad Keys
#define KP_0 0x70
#define KP_1 0x69
#define KP_2 0x72
#define KP_3 0x7A
#define KP_4 0x6B
#define KP_5 0x73
#define KP_6 0x74
#define KP_7 0x6C
#define KP_8 0x75
#define KP_9 0x7D
// KP .
#define KPPD 0x71
// KP +
#define KPAD 0x79
// KP -
#define KPSB 0x7B
// KP *
#define KPML 0x7C
// KP /
#define KPDV 0xE04A
// KP Enter
#define KPEN 0xE05A

// Remapped KeyPad keys
// KP =  (mapped to =)
#define KPEQ 0x55
// KP Clear (mapped to DEL)
#define KPCL 0xE071

// Scancodes for Function keys
#define _F1_ 0x05
#define _F2_ 0x06
#define _F3_ 0x04
#define _F4_ 0x0C
#define _F5_ 0x03
#define _F6_ 0x0B
#define _F7_ 0x83
#define _F8_ 0x0A
#define _F9_ 0x01
#define _F10 0x09
#define _F11 0x78
#define _F12 0x07

// Apple specific function keys
//   Unknown if correct.  Referenced this: 
//   http://www.koders.com/c/fidA6610FF637405C29257109E36D301A7B1FF9DC96.aspx#L252
#define _F13 0x60
#define _F14 0x51
#define _F15 0x62
#define _F16 0x63

#define SHFT 0x12

unsigned rom int scanmatrix [19][8] = {
	{ // 0: 1
		0x0D, // [0] TAB
		0x0E, // [1] `
		_F9_, // [2] F9
		0x5A, // [3] RETURN
		0x58, // [4] CAPS LOCK
		_F12, // [5] F12
		____, // [6]
		0x76, // [7] ESC
 	},
	{ // 1: 2
		__q_, // [0] q
		0x16, // [1] 1
		_F10, // [2] F10
		_F7_, // [3] F7
		__a_, // [4] a
		____, // [5]
		__z_, // [6] z
		_F1_, // [7] F1
 	},
	{ // 2: 4
		__w_, // [0] w
		0x1E, // [1] 2
		_F11, // [2] F11
		_F8_, // [3] F8
		__s_, // [4] s
		____, // [5]
		__x_, // [6] x
		_F2_, // [7] F2
 	},
	{ // 3: 8
		__e_, // [0] e
		0x26, // [1] 3
		0x5B, // [2] ]
		0x55, // [3] =
		__d_, // [4] d
		KPPD, // [5] KP .
		__c_, // [6] c
		_F3_, // [7] F3
 	},
	{ // 4: 10
		__r_, // [0] r
		0x25, // [1] 4
		0x5D, // [2] \ 
		0x66, // [3] BKSPC
		__f_, // [4] f
		KP_0, // [5] KP 0
		__v_, // [6] v
		_F4_, // [7] F4
 	},
	{ // 5: 20
		__t_,   // [0] t
		0x2E,   // [1] 5
		____,   // [2] 
		HELP,   // [3] HELP
		__g_,   // [4] g
		0xE06B, // [5] L ARR
		__b_,   // [6] b
		_F5_,   // [7] F5
 	},
	{ // 6: 40
		__y_,   // [0] y
		0x36,   // [1] 6
		____,   // [2] 
		0xE06C, // [3] HOME
		__h_,   // [4] h
		0xE072, // [5] DN ARR
		__n_,   // [6] n
		0xE075, // [7] UP ARR
 	},
	{ // 7: 80
		____,   // [0] 
		0x14,   // [1] L CTL
		____,   // [2] 
		____,   // [3] 
		____,   // [4] 
		____,   // [5] 
		____,   // [6] 
		0xE014, // [7] R CTL
 	},
	{ // 8: 100
		0x12, // [0] L SHIFT
		____, // [1] 
		____, // [2] 
		____, // [3] 
		____, // [4] 
		____, // [5] 
		____, // [6] 
		0x59, // [7] R SHIFT
 	},
	{ // 9: 200
		____,   // [0] 
		____,   // [1] 
		_F15,   // [2] F15
		_F14,   // [3] F14
		0xE071, // [4] DEL
		0xE069, // [5] END
		_F13,   // [6] F13
		_F16,   // [7] F16
 	},
	{ // 10: 400
		____,   // [0] 
		____,   // [1] 
		0xE011, // [2] R OPTION/ALT
		____,   // [3] 
		0x11,   // [4] L OPTION/ALT
		____,   // [5] 
		____,   // [6] 
		____,   // [7] 
 	},
	{ // 11: 800
		0xE01F, // [0] L APPLE
		____,   // [1] 
		____,   // [2] 
		____,   // [3] 
		____,   // [4] 
		____,   // [5] 
		____,   // [6] 
		____,   // [7] 

 	},
	{ // 12: 1000
		__u_,   // [0] u
		0x3D,   // [1] 7
		0xE07A, // [2] PG DN
		0xE07D, // [3] PG UP
		__j_,   // [4] j
		0xE074, // [5] R ARR
		__m_,   // [6] m
		_F6_,   // [7] F6
 	},
	{ // 13: 2000
		__i_, // [0] i
		0x3E, // [1] 8
		KP_7, // [2] KP 7
		KPCL, // [3] KP CLEAR
		__k_, // [4] k
		KP_1, // [5] KP 1
		0x41, // [6] ,
		KP_4, // [7] KP 4
 	},
	{ // 14: 4000
		__o_, // [0] o
		0x46, // [1] 9
		KP_8, // [2] KP 8
		KPEQ, // [3] KP =
		__l_, // [4] l
		KP_2, // [5] KP 2
		0x49, // [6] .
		KP_5, // [7] KP 5
	},
	{ // 15: 8000
		____,   // [0] 
		____,   // [1] 
		____,   // [2] 
		____,   // [3] 
		____,   // [4] 
		0xE027, // [5] R APPLE
		____,   // [6] 
		____,   // [7] 
	},
	{ // 16: 10000
		__p_, // [0] p
		0x45, // [1] 0
		KP_9, // [2] KP 9
		KPDV, // [3] KP /
		0x4C, // [4] ;
		KP_3, // [5] KP 3
		0x4A, // [6] /
		KP_6, // [7] KP 6
	},
	{ // 17: 20000
		0x54, // [0] [
		0x4E, // [1] -
		KPSB, // [2] KP -
		KPML, // [3] KP *
		0x52, // [4] '
		KPEN, // [5] KP ENTER
		0x29, // [6] SPACE
		KPAD, // [7] KP +
	},
	{ // 18: 40000
		____,   // [0] 
		____,   // [1] 
		____,   // [2] 
		____,   // [3] 
		EJCT,   // [4] EJECT
		0xE023, // [5] VOL MUTE
		0xE032, // [6] VOL +
		0xE021, // [7] VOL -
	},
};

unsigned rom int scanmatrix_dvorak [19][8] = {
	{ // 0: 1
		0x0D, // [0] TAB
		0x0E, // [1] `
		_F9_, // [2] F9
		0x5A, // [3] RETURN
		0x58, // [4] CAPS LOCK
		_F12, // [5] F12
		____, // [6]
		0x76, // [7] ESC
 	},
	{ // 1: 2
		0x52, // [0] ' 
		0x16, // [1] 1
		_F10, // [2] F10
		_F7_, // [3] F7
		__a_, // [4] a
		____, // [5]
		0x4C, // [6] ;
		_F1_, // [7] F1
 	},
	{ // 2: 4
		0x41, // [0] ,
		0x1E, // [1] 2
		_F11, // [2] F11
		_F8_, // [3] F8
		__o_, // [4] o
		____, // [5]
		__q_, // [6] q
		_F2_, // [7] F2
 	},
	{ // 3: 8
		0x49, // [0] .
		0x26, // [1] 3
		0x55, // [2] =
		0x5B, // [3] ]
		__e_, // [4] e
		KPPD, // [5] KP .
		__j_, // [6] j
		0x04, // [7] F3
 	},
	{ // 4: 10
		__p_, // [0] p
		0x25, // [1] 4
		0x5D, // [2] \ 
		0x66, // [3] BKSPC
		__u_, // [4] u
		KP_0, // [5] KP 0
		__k_, // [6] k
		_F4_, // [7] F4
 	},
	{ // 5: 20
		__y_,   // [0] y
		0x2E,   // [1] 5
		____,   // [2] 
		HELP,   // [3] HELP
		__i_,   // [4] i
		0xE06B, // [5] L ARR
		__x_,   // [6] x
		_F5_,   // [7] F5
 	},
	{ // 6: 40
		__f_,   // [0] f
		0x36,   // [1] 6
		____,   // [2] 
		0xE06C, // [3] HOME
		__d_,   // [4] d
		0xE072, // [5] DN ARR
		__b_,   // [6] b
		0xE075, // [7] UP ARR
 	},
	{ // 7: 80
		____,   // [0] 
		0x14,   // [1] L CTL
		____,   // [2] 
		____,   // [3] 
		____,   // [4] 
		____,   // [5] 
		____,   // [6] 
		0xE014, // [7] R CTL
 	},
	{ // 8: 100
		0x12, // [0] L SHIFT
		____, // [1] 
		____, // [2] 
		____, // [3] 
		____, // [4] 
		____, // [5] 
		____, // [6] 
		0x59, // [7] R SHIFT
 	},
	{ // 9: 200
		____,   // [0] 
		____,   // [1] 
		_F15,   // [2] F15
		_F14,   // [3] F14
		0xE071, // [4] DEL
		0xE069, // [5] END
		_F13,   // [6] F13
		_F16,   // [7] F16
 	},
	{ // 10: 400
		____,   // [0] 
		____,   // [1] 
		0xE011, // [2] R OPTION/ALT
		____,   // [3] 
		0x11,   // [4] L OPTION/ALT
		____,   // [5] 
		____,   // [6] 
		____,   // [7] 
 	},
	{ // 11: 800
		0xE01F, // [0] L APPLE
		____,   // [1] 
		____,   // [2] 
		____,   // [3] 
		____,   // [4] 
		____,   // [5] 
		____,   // [6] 
		____,   // [7] 

 	},
	{ // 12: 1000
		__g_,   // [0] g
		0x3D,   // [1] 7
		0xE07A, // [2] PG DN
		0xE07D, // [3] PG UP
		__h_,   // [4] h
		0xE074, // [5] R ARR
		__m_,   // [6] m
		0x0B,   // [7] F6
 	},
	{ // 13: 2000
		__c_, // [0] c
		0x3E, // [1] 8
		KP_7, // [2] KP 7
		KPCL, // [3] KP CLEAR
		__t_, // [4] t
		KP_1, // [5] KP 1
		__w_, // [6] w
		KP_4, // [7] KP 4
 	},
	{ // 14: 4000
		__r_, // [0] r
		0x46, // [1] 9
		KP_8, // [2] KP 8
		KPEQ, // [3] KP =
		__n_, // [4] n
		KP_2, // [5] KP 2
		__v_, // [6] v
		KP_5, // [7] KP 5
	},
	{ // 15: 8000
		____,   // [0] 
		____,   // [1] 
		____,   // [2] 
		____,   // [3] 
		____,   // [4] 
		0xE027, // [5] R APPLE
		____,   // [6] 
		____,   // [7] 
	},
	{ // 16: 10000
		__l_, // [0] l
		0x45, // [1] 0
		KP_9, // [2] KP 9
		KPDV, // [3] KP /
		__s_, // [4] s
		KP_3, // [5] KP 3
		__z_, // [6] z
		KP_6, // [7] KP 6
	},
	{ // 17: 20000
		0x4A, // [0] /
		0x54, // [1] [
		KPSB, // [2] KP -
		KPML, // [3] KP *
		0x4E, // [4] -
		KPEN, // [5] KP ENTER
		0x29, // [6] SPACE
		KPAD, // [7] KP +
	},
	{ // 18: 40000
		____,   // [0] 
		____,   // [1] 
		____,   // [2] 
		____,   // [3] 
		EJCT,   // [4] EJECT
		0xE023, // [5] VOL MUTE
		0xE032, // [6] VOL +
		0xE021, // [7] VOL -
	},
};

#endif